[
   Takes an integer from stdin and emits its factors to stdout

   Factor an arbitrarily large positive integer

   Copyright (C) 1999 by Brian Raiter
   under the GNU General Public License
]

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-

*
* read in the number
*

<<<<<<<<<+
[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<]
  >>>>>>>>>>,----------]
>>>>>>>>>>[------------------------------------->>>>>>>>>->]
<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-

*
* display the number and initialize the loop variable to two
*

[>++++++++++++++++++++++++++++++++++++++++++++++++.
  ------------------------------------------------<<<<<<<<<<<]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
--------------------------.[-]
>>>>>>>>>>>>++<<<<+

*
* the main loop
*

[ [-]>>

  *
  * make copies of the number and the loop variable
  *

  [>>>>[-]>[-]>[-]>[-]
    >[-]>[-]
    <<<<<<<[->>>+>+<<<<]>>>>>>>>]
  <<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>
  [>[->>>+>>+<<<<<]>>>>>>>>>]
  <<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>

  *
  * divide the number by the loop variable
  *

  [>>>[-]>>>[-]>[-]>>>]                                  initialize
  <<<<<<<<<<[<<<<<<<<<<]
  >>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+
  [ ->>                               double divisor until above dividend
    [>>>>>>[->++<]>>>>]<<<<<<<<<<
    [>>>>>>>>[-]>[-]
       <<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
    [>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
            [->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>]
    <<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
    [>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>
            [-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>]
    <<<<<<<<<<
    [>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<]
    >>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<<
    [>>>>>>>>[->-<]>
      [<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<]
        >>>>>>>>>>>>>>>>>>>]
      <<<<<<<<<<<<<<<<<<<]
    >>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]<
  ]
  >>>>>>>>
  [                                   subtract divisor from dividend
    <<<<<<
    [>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<<
    [>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>
    [>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<<
    [>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>>
    [>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
            [++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>]
    >>>>>>>+
    [                                 if difference is nonnegative then
      [-]<<<<<<<<<<<<<<<<<            replace dividend and increment quotient
      [>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>>
      [>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<<
      [>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>>
      [>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>
                [-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<<
                [-<<<<<<+>>>>>>]]]]]]]]]]]>]
      >>>>>>>
    ]                                 halve divisor and loop until zero
    <<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>>
    [>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<<
    [+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>
             [-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<<
             [->>>>>>>+<<<<<<<]-<<<<<<<<<<]
    >>>>>>>
    [-<<<<<<<<<<<+>>>>>>>>>>>]
      >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<
    [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>
              [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<
              [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]
    >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>
    [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<
    [<<<<<<<<<<]>>>>>>>>>>
    >>>>>>
  ]
  <<<<<<

  *
  * make copies of the loop variable and the quotient
  *

  [>>>[->>>>+>+<<<<<]>>>>>>>]
  <<<<<<<<<<
  [>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<]
  >>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<<

  *
  * break out of the loop if the quotient is larger than the loop variable
  *

  [>>>>>>>>>[-<->]<
    [<<<<<<<<
      [<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
    >>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]
  >>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+

  [ [-]

    *
    * partially increment the loop variable
    *

    <[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<

    *
    * examine the remainder for nonzero digits
    *

    [<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<]
    >>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<]
    >>>>-

    [ [+]

      *
      * decrement the loop variable and replace the number with the quotient
      *

      >>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<<

      *
      * display the loop variable
      *

      [+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]-
      [>>++++++++++++++++++++++++++++++++++++++++++++++++.
         ------------------------------------------------<<<<<<<<<<<<]
      ++++++++++++++++++++++++++++++++.[-]>>>>

    ]

    *
    * normalize the loop variable
    *

    >>>>>>
    [>>[->>>>>+<<<<<[->>>>>+<<<<<
       [->>>>>+<<<<<[->>>>>+<<<<<
       [->>>>>+<<<<<[->>>>>+<<<<<
       [->>>>>+<<<<<[->>>>>+<<<<<
       [->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<<
       [->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>]
    <<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<]
    >>>>>>>>>

  ]<

]>>

*
* display the number and end
*

[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-
[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<]
++++++++++.
